home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1191 / 1191.xpi / chrome / reminderfox.jar / content / reminderfox / editing / eventEntry.js next >
Text File  |  2009-11-25  |  67KB  |  1,960 lines

  1. if (undefined == reminderFoxBundle) {
  2.     var reminderFoxBundle = document.getElementById("reminderFox-bundle");  
  3. }
  4. var reminderFox_innerTimeClicked = false;
  5. var endDateMinutesOffset = null;
  6.  
  7. function reminderFox_launchURL() {   
  8.     var urlText = document.getElementById("url");
  9.     if ( urlText.value != "" ) {    
  10.         reminderFox_openURL(  urlText.value );
  11.     }
  12. }
  13.  
  14. function reminderFox_launchLocation() {
  15.     var urlText = document.getElementById("location");
  16.     if ( urlText != null && urlText.value != "" ) {    
  17.          var url = urlText.value;
  18.          // if location starts with URL, use that
  19.          if ( url.indexOf( "http" ) != 0 )  {
  20.              // otherwise use google maps
  21.              url =  "http://maps.google.com/maps?q=" + url;
  22.          }
  23.         reminderFox_openURL(  url );
  24.     }
  25. }
  26.  
  27. function reminderFox_toggleNotes() {
  28.     var notesToggleButton = document.getElementById("notesToggle");
  29.     var notesText = document.getElementById("notesText");
  30.     
  31.     if ( notesToggleButton.getAttribute("checked")     ) {
  32.         notesText.setAttribute("hidden", "true");    
  33.         notesToggleButton.setAttribute("tooltiptext", reminderFoxBundle.getString("rf.options.notes.tooltip.show"));    
  34.         notesToggleButton.removeAttribute( "checked" );
  35.     }
  36.     else {
  37.         notesText.setAttribute("hidden", "false");    
  38.         notesToggleButton.setAttribute("tooltiptext", reminderFoxBundle.getString("rf.options.notes.tooltip.hide"));    
  39.         notesToggleButton.setAttribute( "checked", true );
  40.     }
  41.     sizeToContent();
  42. }
  43.  
  44. function isDateEnabled() {  
  45.     var dateEnabled = true;
  46.     var todoDateCheckbox = document.getElementById("todoDateCheckbox");
  47.     if ( todoDateCheckbox != null ) {
  48.         dateEnabled =  todoDateCheckbox.getAttribute("checked" );
  49.     }
  50.     if ( dateEnabled == true || dateEnabled == "true" ) {     
  51.         return true;
  52.     }
  53.     else {
  54.         return false;
  55.     }
  56. }
  57.  
  58. function showCalendar() {
  59.     // ignore if datepicker is disabled
  60.     var datePicker = document.getElementById("datepickerToggle");
  61.     if ( reminderFox_endDateClicked ) {
  62.         datePicker = document.getElementById("datepickerEndToggle");
  63.     }
  64.     if ( datePicker != null && (datePicker.getAttribute("disabled") == true || datePicker.getAttribute("disabled") == "true" ) ) {
  65.         return false;
  66.     }
  67.     
  68.     if ( isDateEnabled() ) {  
  69.         // handle user-specified calendar size here...  
  70.         oeDatePicker.resizeCalendar();  
  71.         
  72.         var monthlist = document.getElementById('monthlist');
  73.         var daylist = document.getElementById('daylist');
  74.         var yearlist = document.getElementById('yearlist');
  75.         if ( reminderFox_endDateClicked ) {
  76.             monthlist = document.getElementById('endmonthlist');
  77.             daylist = document.getElementById('enddaylist');
  78.             yearlist = document.getElementById('endyearlist');
  79.         }
  80.         
  81.         var currentMonth = monthlist.selectedIndex;
  82.         var currentDay =  daylist.label;
  83.         var currentYear =  yearlist.label;
  84.         
  85.         var reminderDate =  new Date( currentYear, currentMonth, currentDay );
  86.         oeDatePicker.onpopupshowing(reminderDate, true);        
  87.         return true;
  88.     }
  89.     else {
  90.         return false; // no todo date is set - don't want to show this popup
  91.     }        
  92. }
  93.  
  94.  
  95. function addCustomRepeat() {
  96.     var reminderEvent = window.arguments[0].reminder;
  97.     if ( reminderEvent == null ) {
  98.         reminderEvent = window.arguments[0].todo;
  99.     }
  100.     
  101.     var currentSelectedDate = getDateFromUI(null)
  102.     var newOptions = { reminderfoxEvent: reminderEvent, currentDate: currentSelectedDate }
  103.     window.openDialog("chrome://reminderfox/content/editing/repeatDialog.xul",
  104.             "repeatDialog", "chrome,resizable,modal", newOptions );
  105.             
  106.     reminderEvent.recurrence = newOptions.reminderfoxEvent.recurrence;
  107.     loadEventRepeat( reminderEvent, true );        
  108. }
  109.  
  110. function popupClosed2(element) {    
  111.     if ( isDateEnabled() ) {
  112.         reminderFox_optionsSetNewReminderDate( oeDatePicker.gSelectedDate, true, reminderFox_endDateClicked, true );
  113.         reminderFox_optionsPopulateYearList(oeDatePicker.gSelectedDate, reminderFox_endDateClicked  );
  114.         if ( reminderFox_endDateClicked ) {
  115.             reminderFox_timeChanged( true );
  116.         }
  117.         else {
  118.             updateRepeatingList(oeDatePicker.gSelectedDate);
  119.             reminderFox_timeChanged( false );
  120.         }
  121.     }
  122.     reminderFox_endDateClicked = false;
  123. }
  124.  
  125.  
  126. function reminderFox_optionsSetNewReminderDate( date, repopulateDays, isEndDate, dontSetEndTime) { 
  127.     var month = date.getMonth();
  128.     var day = date.getDate() - 1; // account for 1-offset    
  129.     var monthlist = null;
  130.     if ( isEndDate ) {
  131.         monthlist = document.getElementById('endmonthlist');
  132.     }
  133.     else {
  134.         monthlist = document.getElementById('monthlist');
  135.     }
  136.     if ( monthlist != null ) { 
  137.         var items = monthlist.firstChild.childNodes;
  138.         monthlist.selectedItem = items[month];
  139.         
  140.         // if month or year has changed, we want to reseed the date drop-down list with the appropriate
  141.         // number of days for that month
  142.         if ( repopulateDays ) {
  143.                reminderFox_optionsPopulateDateList(date, isEndDate);
  144.            }
  145.         
  146.         var dayList;
  147.         if ( isEndDate ) {
  148.             dayList = document.getElementById('enddaylist');
  149.         }
  150.         else {
  151.             dayList = document.getElementById('daylist');
  152.         }
  153.         items = dayList.firstChild.childNodes;
  154.         dayList.selectedItem = items[day];    
  155.         
  156.     //    // update end year...
  157.     //    if ( isEndDate ) {
  158.     //        var yearlist = document.getElementById('endyearlist');
  159.     //    }
  160.         
  161.         if ( isEndDate ) {
  162.             var yearlist = document.getElementById('endyearlist');
  163.             yearlist.label = date.getFullYear();
  164.             
  165.             if ( dontSetEndTime ) {
  166.             }
  167.             else {
  168.                 reminderFox_updateTime( date, true);
  169.             }
  170.         }
  171.         
  172.         updateDateDescriptionLabel();
  173.     }
  174. }
  175.  
  176. var reminderFox_endDateClicked;
  177. function onclickFunc(event, isEndDate) {
  178.     var datepickerToggle = null;
  179.     if ( isEndDate ) {
  180.         reminderFox_endDateClicked = true;
  181.         datepickerToggle = document.getElementById("datepickerEndToggle");
  182.     }
  183.     else {
  184.         reminderFox_endDateClicked = false;
  185.         datepickerToggle = document.getElementById("datepickerToggle");
  186.     }
  187.     var treeContextMenu = document.getElementById("oe-date-picker-popup");
  188.     treeContextMenu.showPopup(datepickerToggle, event.screenX, event.screenY, "bottomleft", "topleft"); 
  189. }
  190.  
  191. function reminderFox_optionsPopulateDateList( currentDate, isEndDate) {
  192.     var year = parseInt(currentDate.getFullYear());
  193.     var daylist = null;
  194.     if ( isEndDate ) {
  195.         daylist = document.getElementById('enddaylist');
  196.     }
  197.     else {
  198.         daylist = document.getElementById('daylist');
  199.     }
  200.     var items = daylist.firstChild.childNodes;
  201.     // remove ending nodes that could possibly be different each month
  202.     // (i.e. any date greater than 28)
  203.     var length = daylist.firstChild.childNodes.length - 1;    
  204.     for ( var j = length; j >= 28; j-- ) {
  205.         daylist.firstChild.removeChild( items[j] );
  206.     }
  207.  
  208.     // now add proper # of days for this month
  209.     var dayArray;
  210.     if (reminderFox_isLeapYear(parseInt(year))) {
  211.         dayArray = REMINDER_FOX_lDOMonth;
  212.     }
  213.     else {
  214.         dayArray = REMINDER_FOX_DOMonth;
  215.     }
  216.  
  217.     var monthlist = null;
  218.     if ( isEndDate ) {
  219.         monthlist = document.getElementById('endmonthlist');
  220.     }
  221.     else {
  222.         monthlist = document.getElementById('monthlist');
  223.     }
  224.     var currentMonth = monthlist.selectedIndex;
  225.  
  226.     var numOfDays = dayArray[currentMonth];
  227.      for ( var k = 29; k < numOfDays + 1; k++ ) {
  228.         var newDay = document.createElement("menuitem");
  229.         var str = k + "";
  230.         newDay.setAttribute("label", str);
  231.         daylist.firstChild.appendChild(newDay);
  232.     }
  233.     
  234.  
  235.     // now make sure the dateList is not showing a date greater than
  236.     // the number of days in the selected month; if it is set the list
  237.     // to show the last day of the month
  238.     var dayname = parseInt(daylist.label);
  239.  
  240.     var numOfDaysInt = parseInt( numOfDays );
  241.     if ( dayname > numOfDaysInt ) {
  242.         daylist.selectedItem = daylist.firstChild.childNodes[numOfDaysInt - 1];
  243.     }        
  244. }
  245.  
  246.  
  247.  
  248.  
  249. function reminderFox_optionsPopulateYearList( currentDate, isEndDate ) {
  250.     var todaysDate = new Date();
  251.     // start with last year , in case they want to create a repeating reminder
  252.     // from a previous month
  253.     var year = parseInt(todaysDate.getFullYear()) -1;   
  254.  
  255.     var yearlist = document.getElementById('yearlist');
  256.     if ( isEndDate ) {
  257.         yearlist = document.getElementById('endyearlist');
  258.     }
  259.     while ( yearlist.firstChild.hasChildNodes()) {
  260.           yearlist.firstChild.removeChild( yearlist.firstChild.firstChild);
  261.     }    
  262.  
  263.      for ( var k = 0; k < 5; k++ ) {
  264.         var newYear = document.createElement("menuitem");
  265.         var yearVal = year + k;
  266.         newYear.setAttribute("label", yearVal);
  267.         yearlist.firstChild.appendChild(newYear);
  268.     }
  269.     
  270.     yearlist.label = currentDate.getFullYear();
  271. }
  272.  
  273.  
  274. function optionsDateChanged(repopulateDays, isEndDate) {
  275.     var monthlist = document.getElementById('monthlist');
  276.     var daylist = document.getElementById('daylist');
  277.     var yearlist = document.getElementById('yearlist');
  278.     
  279.     if ( isEndDate ) {
  280.         monthlist = document.getElementById('endmonthlist');
  281.         daylist = document.getElementById('enddaylist');
  282.         yearlist = document.getElementById('endyearlist');
  283.     
  284.     }
  285.     var month = monthlist.selectedIndex;
  286.     var day =daylist.label;
  287.     var year = yearlist.label;
  288.     
  289.     // date  check --- if day is less than month; then set it to proper value
  290.     day = reminderFox_getValidDateForMonth( year, month, day );
  291.     
  292.     var date = new Date( year, month, day );
  293.     reminderFox_optionsSetNewReminderDate( date, repopulateDays, isEndDate, true );
  294.     
  295.     if ( isEndDate ) {
  296.         // set new end date offset
  297.         calculateEndTimeOffset();
  298.     }
  299.     else {
  300.         // start date has changed; set new end date based on offset
  301.         updateEndDateWithOffset();
  302.         
  303.         updateRepeatingList(date);
  304.     }
  305. }
  306.  
  307. function reminderFox_allDayChanged(ignoreSetDefault) {
  308.     var allDay = document.getElementById("reminderFox-all-day");    
  309.     var allDayVal =  allDay.getAttribute("checked" );
  310.     if ( allDayVal == true || allDayVal == "true") {
  311.         document.getElementById("reminderFox-timeList").setAttribute("disabled", "true");
  312.         document.getElementById("reminderFox-endTimeList").setAttribute("disabled", "true");    
  313.         
  314.         calculateEndTimeOffset();    
  315.     }
  316.     else {
  317.         document.getElementById("reminderFox-timeList").removeAttribute("disabled" );
  318.         document.getElementById("reminderFox-endTimeList").removeAttribute("disabled" );
  319.         
  320.         calculateEndTimeOffset();
  321.         if ( (ignoreSetDefault== null || !ignoreSetDefault ) && (endDateMinutesOffset != null && endDateMinutesOffset == 0) ) {
  322.             // same start and end time - default to an hour later...
  323.             var endDate = getEndDate();
  324.             endDate.setHours( endDate.getHours() + 1 );
  325.             reminderFox_optionsSetNewReminderDate( endDate, true, true );
  326.             calculateEndTimeOffset();
  327.         }
  328.         
  329.     }
  330. }
  331.  
  332. function reminderFox_alertChanged() {
  333.     var showAlert = document.getElementById("reminderFox-alert");    
  334.     var alertVal =  showAlert.getAttribute("checked" );
  335.     if ( alertVal == false || alertVal == "false") {
  336.             document.getElementById("reminderFox-alertTime").setAttribute("disabled", "true");    
  337.             document.getElementById("reminderFox-alertInfo").setAttribute("disabled", "true");    
  338.             document.getElementById("reminderFox-alertTimeUnits").setAttribute("disabled", "true");    
  339.     }
  340.     else {
  341.             document.getElementById("reminderFox-alertTime").removeAttribute("disabled" );
  342.             document.getElementById("reminderFox-alertInfo").removeAttribute("disabled" );
  343.             document.getElementById("reminderFox-alertTimeUnits").removeAttribute("disabled" );
  344.     }
  345. }
  346.  
  347.  
  348.  
  349. function showMoreOptionsPane(forceShow, personsON) { 
  350.     var morePanel = document.getElementById("moreOptionsVbox");
  351.     
  352.     if ( forceShow || morePanel.getAttribute('hidden') == "true") {
  353.         morePanel.setAttribute('hidden', 'false');   
  354.         document.getElementById('moreReminderItems').setAttribute('label', reminderFoxBundle.getString("rf.reminderoptions.less.button.label")    );  
  355.     } 
  356.     else {
  357.         morePanel.setAttribute('hidden', 'true');   
  358.         document.getElementById('moreReminderItems').setAttribute('label', reminderFoxBundle.getString("rf.reminderoptions.more.button.label"));  
  359.     }
  360.     
  361.     // gW added to process 'Scheduled Persons'  +++++  +++++  +++++  
  362.     if (personsON ) { 
  363.        var invitBox = document.getElementById("moreOptionsInvitationBox");         
  364.        invitBox.setAttribute ('hidden', 'false');
  365.      } 
  366.      
  367.      // If calling this in response to the MORE> button event, resize window
  368.      if ( !forceShow ) {
  369.          sizeToContent();
  370.      }
  371. }
  372.  
  373. function showMailIcon() {
  374.     var displayMailButton = document.getElementById("displayMail");
  375.     displayMailButton.setAttribute( "checked", false     );    
  376.     window.arguments[0].showMail = true;
  377.     window.close();
  378.  
  379. }
  380.  
  381.  
  382. function moveElementToMore( elementName, morePanel ) {
  383.     var item = document.getElementById(elementName);
  384.     if ( item != null ) { 
  385.         var clonedItem = item.cloneNode( true );
  386.         item.parentNode.removeChild( item );
  387.         morePanel.appendChild( clonedItem );
  388.     }
  389. }
  390.  
  391.  
  392. function loadMoreOptions( event ) { 
  393.      var morePanel = document.getElementById("moreOptionsVbox");
  394.      var defaultMoreItemString = reminderFox_getPreferenceValue( REMINDER_FOX_DEFAULT_MORE, REMINDER_FOX_DEFAULT_MORE_DEFAULT_VALUE );
  395.      
  396.      // showInTooltip,repeat,url,category,location,important,remindUntilComplete,alarm,endDate
  397.      var defaultMoreItems = defaultMoreItemString.split(",");
  398.      for ( var i = 0; i < defaultMoreItems.length; i++ ) {
  399.         var moreItem = defaultMoreItems[i];
  400.         moreItem = reminderFox_trim(moreItem);
  401.          if ( moreItem == "location" ) { 
  402.              moveElementToMore( 'locationHbox', morePanel);
  403.          }
  404.         else if ( moreItem == "url" ) { 
  405.             moveElementToMore( 'urlHbox', morePanel);
  406.          }  
  407.          else if ( moreItem == "category" ) { 
  408.             moveElementToMore( 'catHbox', morePanel);
  409.          }  
  410.          else if ( moreItem == "repeat" ) { 
  411.             moveElementToMore( 'repeatHboxOverlay', morePanel);
  412.          }  
  413.          else if ( moreItem == "alarm" ) { 
  414.             moveElementToMore( 'alertEntry', morePanel);
  415.          }  
  416.          else if ( moreItem == "important" ) { 
  417.             moveElementToMore( 'important', morePanel);
  418.          }  
  419.          else if ( moreItem == "remindUntilComplete" ) { 
  420.             moveElementToMore( 'remindUntilComplete', morePanel);
  421.          }  
  422.          else if ( moreItem == "showInTooltip" ) { 
  423.             moveElementToMore( 'showInTooltip', morePanel);
  424.          }  
  425.          else if ( moreItem == "endDate" ) { 
  426.              var endDateHbox = document.createElement("hbox");
  427.              endDateHbox.setAttribute( "align", "center");
  428.             moveElementToMore( 'dateEndLabel', endDateHbox);
  429.             moveElementToMore( 'endDateEntryHBox', endDateHbox);
  430.             moveElementToMore( 'endTimeEntry', endDateHbox);
  431.             morePanel.appendChild( endDateHbox );
  432.          }  
  433.       }    
  434.     
  435.     // gW added to process 'Scheduled Persons'
  436.     var schedulePersons = extras4schedulePersons(event);
  437.     if ( schedulePersons ) {
  438.         // move the scheduling support to the end of the MORE> list
  439.         moveElementToMore( 'moreOptionsInvitationBox', morePanel);
  440.     }
  441.     
  442.     // TODO: have a pref to decide whether to initially show the More options or not...
  443.     // would have to scan through morePref list to see which ones
  444.     // to check for    
  445.     // TODO: also handle showing the two footer lines with no contents between
  446.     
  447.     if ( (event.location != null && event.location.length > 0 ) 
  448.         || (event.url != null && event.url.length > 0) 
  449.         || schedulePersons) {
  450.         showMoreOptionsPane( true, schedulePersons );
  451.     }
  452. }
  453.  
  454. function saveMoreOptions( event ) {
  455.     var locationText = document.getElementById("location");
  456.     if ( locationText.value != "" ) {
  457.         event.location = locationText.value;
  458.     }
  459.     else {
  460.         event.location = null;
  461.     }
  462.     
  463.     var urlText = document.getElementById("url");
  464.     if ( urlText.value != "" ) {
  465.         event.url = urlText.value;
  466.     }
  467.     else {
  468.         event.url = null;
  469.     }
  470. }
  471.  
  472.  
  473. function reminderFox_repeatChanged() {
  474.     var repeat = document.getElementById("reminderFox-repeat");    
  475.     var repeatVal =  repeat.getAttribute("checked" );
  476.     if ( repeatVal == false || repeatVal == "false") {
  477.             document.getElementById("reminderFox-repeatList").setAttribute("disabled", "true");    
  478.     }
  479.     else {
  480.             document.getElementById("reminderFox-repeatList").removeAttribute("disabled" );
  481.             
  482.             // repeat has been enabled - update repeat list to make sure it reflects current date
  483.             var monthlist = document.getElementById('monthlist');
  484.             var month = monthlist.selectedIndex;
  485.             
  486.             var daylist = document.getElementById('daylist');
  487.             var day =daylist.label;
  488.             // date  check --- if day is less than month; then set it to proper value
  489.             var yearlist = document.getElementById('yearlist');
  490.             var year = yearlist.label;
  491.             day = reminderFox_getValidDateForMonth( year, month, day );
  492.         
  493.             var date = new Date( year, month, day );        
  494.             updateRepeatingList(date);                
  495.     }
  496. }
  497.  
  498.  
  499. function updateRepeatingList(currentDate, reminder, ignoreCustomTag) {
  500.     var repeat = document.getElementById("reminderFox-repeat");    
  501.     if ( repeat != null ) {
  502.         if ( repeat.getAttribute( "checked" ) != true && repeat.getAttribute("checked" ) != "true" ) {
  503.             return;   // exit - no repeating option is selected
  504.         }
  505.     }
  506.     var monthlist = document.getElementById('monthlist');
  507.     var daylist = document.getElementById('daylist');    
  508.     var startingParens = "    (";
  509.     var closingParens = ")";
  510.  
  511.     var repeatList = document.getElementById("reminderFox-repeatList");    
  512.     var items = repeatList.firstChild.childNodes;
  513.     var reminderDay = currentDate.getDay();
  514.     var weekNumber = reminderFox_getWeekNumber( currentDate );    
  515.     var repeatingSelectedIndex = repeatList.selectedIndex;
  516.     var val, index;
  517.     var CUSTOM =     reminderFoxBundle.getString("rf.options.repeat.custom.name");
  518.     
  519.     if ( reminder == null ) {
  520.         if ( window.arguments[0].reminder != null ) {
  521.             reminder =  window.arguments[0].reminder;
  522.             if ( reminder == null ) {
  523.                 reminder = window.arguments[0].todo;    
  524.             }
  525.         }
  526.         else {
  527.             if (  window.arguments[0].todo != null ) {
  528.                 reminder = window.arguments[0].todo;    
  529.             }
  530.         }
  531.     }
  532.     
  533.     // yearly
  534.     val = items[0].getAttribute("label" );
  535.     index = val.indexOf( startingParens );
  536.     if ( index != -1 ) {
  537.         val = val.substring( 0, index );
  538.     }    
  539.     if (reminder != null && !ignoreCustomTag && reminder.recurrence.type  == REMINDER_RECURRENCE_YEARLY  && ( reminder.recurrence.byDay != null || (reminder.recurrence.interval != null && reminder.recurrence.interval > 1) ||  reminder.recurrence.endDate != null )) {
  540.         val = val + startingParens + CUSTOM + closingParens;
  541.     }
  542.     items[0].label = val;
  543.     if ( repeatingSelectedIndex == 0 ) {
  544.         repeatList.selectedItem = items[6];
  545.         repeatList.selectedItem = items[0];
  546.     }    
  547.     
  548.     // daily
  549.     val = items[6].getAttribute("label" );
  550.     index = val.indexOf( startingParens );
  551.     if ( index != -1 ) {
  552.         val = val.substring( 0, index );
  553.     }    
  554.     if (reminder != null && !ignoreCustomTag && reminder.recurrence.type  == REMINDER_RECURRENCE_DAILY  && ( reminder.recurrence.byDay != null || (reminder.recurrence.interval != null && reminder.recurrence.interval > 1) ||  reminder.recurrence.endDate != null )) {
  555.         val = val + startingParens + CUSTOM + closingParens;            
  556.     }
  557.     items[6].label = val;
  558.     if ( repeatingSelectedIndex == 5 ) {
  559.         repeatList.selectedItem = items[0];
  560.         repeatList.selectedItem = items[6];
  561.     }
  562.     
  563.     // yearly by day
  564.     val = items[1].getAttribute("label" );
  565.     index = val.indexOf( startingParens );
  566.     if ( index != -1 ) {
  567.         val = val.substring( 0, index );
  568.     }    
  569.     
  570.     if (reminder != null && !ignoreCustomTag && reminder.recurrence.type  == REMINDER_RECURRENCE_YEARLY_DAY  && ( reminder.recurrence.byDay != null || (reminder.recurrence.interval != null && reminder.recurrence.interval > 1) ||  reminder.recurrence.endDate != null )) {
  571.         val = val + startingParens + CUSTOM + ": " + getWeekName(weekNumber) + " " +getDayName(reminderDay) + " " +  
  572.             reminderFoxBundle.getString("rf.options.weekof.name") + " " +  monthlist.selectedItem.label+ closingParens;
  573.     }
  574.     else {
  575.         val = val + startingParens +getWeekName(weekNumber) + " " +getDayName(reminderDay) + " " +  
  576.             reminderFoxBundle.getString("rf.options.weekof.name") + " " +  monthlist.selectedItem.label+ closingParens;
  577.     }
  578.     items[1].label = val;
  579.     if ( repeatingSelectedIndex == 1 ) {
  580.         repeatList.selectedItem = items[0];
  581.         repeatList.selectedItem = items[1];
  582.     }    
  583.     
  584.     // monthly by date
  585.     val = items[2].getAttribute("label" );
  586.     index = val.indexOf( startingParens );
  587.     if ( index != -1 ) {
  588.         val = val.substring( 0, index );
  589.     }    
  590.     var dateStr = reminderFoxBundle.getString("rf.options.dateshort."+currentDate.getDate()+".name") ;
  591.     if (reminder != null && !ignoreCustomTag && reminder.recurrence.type  == REMINDER_RECURRENCE_MONTHLY_DATE  && ( reminder.recurrence.byDay != null || (reminder.recurrence.interval != null && reminder.recurrence.interval > 1) ||  reminder.recurrence.endDate != null )) {
  592.         val = val + startingParens + CUSTOM + ": " + dateStr + " " +reminderFoxBundle.getString("rf.options.weekofmonth.name")  +closingParens;
  593.     }
  594.     else {
  595.         val = val + startingParens + dateStr + " " +reminderFoxBundle.getString("rf.options.weekofmonth.name")  +closingParens;
  596.     }
  597.     items[2].label = val;    
  598.     if ( repeatingSelectedIndex == 2 ) {
  599.         repeatList.selectedItem = items[0];
  600.         repeatList.selectedItem = items[2];
  601.     }    
  602.     
  603.     // monthly by day
  604.     val = items[3].getAttribute("label" );
  605.     index = val.indexOf( startingParens );
  606.     if ( index != -1 ) {
  607.         val = val.substring( 0, index );
  608.     }    
  609.     if (reminder != null && !ignoreCustomTag  && reminder.recurrence.type  == REMINDER_RECURRENCE_MONTHLY_DAY  && ( reminder.recurrence.byDay != null || (reminder.recurrence.interval != null && reminder.recurrence.interval > 1) ||  reminder.recurrence.endDate != null )) {
  610.         val = val + startingParens + CUSTOM + ": " + getWeekName(weekNumber) + " " +getDayName(reminderDay) + " " +  
  611.             reminderFoxBundle.getString("rf.options.weekofmonth.name") + closingParens;
  612.     }
  613.     else {
  614.         val = val + startingParens +getWeekName(weekNumber) + " " +getDayName(reminderDay) + " " +  
  615.             reminderFoxBundle.getString("rf.options.weekofmonth.name") + closingParens;
  616.     }
  617.     items[3].label = val;        
  618.     if ( repeatingSelectedIndex == 3 ) {
  619.         repeatList.selectedItem = items[0];
  620.         repeatList.selectedItem = items[3];
  621.     }    
  622.     
  623.     // weekly
  624.     val = items[4].getAttribute("label" );
  625.     index = val.indexOf( startingParens );
  626.     if ( index != -1 ) {
  627.         val = val.substring( 0, index );
  628.     }    
  629.     
  630.     if ( reminder != null && !ignoreCustomTag && reminder.recurrence.type  == REMINDER_RECURRENCE_WEEKLY &&
  631.         reminder.recurrence.interval != 2) { // only change label to Custom if it's not a bi-weekly
  632.         if ( ( reminder.recurrence.byDay != null || (reminder.recurrence.interval != null && reminder.recurrence.interval > 2) ||  reminder.recurrence.endDate != null )) {
  633.             if (  reminder.recurrence.byDay == null ) {
  634.                 val = val + startingParens + CUSTOM + ": " + reminderFoxBundle.getString("rf.options.everyweek.name") + " " +getDayName(reminderDay) + closingParens;
  635.             }
  636.             else {
  637.                 val = val + startingParens + CUSTOM + closingParens;
  638.             }
  639.         }
  640.         else {
  641.             val = val + startingParens + reminderFoxBundle.getString("rf.options.everyweek.name") + " " +getDayName(reminderDay) + closingParens;
  642.         }
  643.     }
  644.     else {
  645.         val = val + startingParens + reminderFoxBundle.getString("rf.options.everyweek.name") + " " +getDayName(reminderDay) + closingParens;
  646.     }
  647.     items[4].label = val;        
  648.     if ( repeatingSelectedIndex == 4 ) {
  649.         repeatList.selectedItem = items[0];
  650.         repeatList.selectedItem = items[4];
  651.     }        
  652.     
  653.     // bi-weekly
  654.     val = items[5].getAttribute("label" );
  655.     index = val.indexOf( startingParens );
  656.     if ( index != -1 ) {
  657.         val = val.substring( 0, index );
  658.     }    
  659.     
  660.     if ( reminder != null && !ignoreCustomTag && reminder.recurrence.type  == REMINDER_RECURRENCE_WEEKLY &&
  661.           reminder.recurrence.interval == 2) { // only change label if the recurrence is set to 2 (bi-weekly)
  662.         if ( reminder.recurrence.byDay != null  || reminder.recurrence.endDate != null ) {
  663.             if (  reminder.recurrence.byDay == null ) {
  664.                 val = val + startingParens + CUSTOM + ": " + reminderFoxBundle.getString("rf.options.everyweek.name") + " " +getDayName(reminderDay) + closingParens;
  665.             }
  666.             else {
  667.                 val = val + startingParens + CUSTOM + closingParens;
  668.             }
  669.         }
  670.         else {
  671.             val = val + startingParens + reminderFoxBundle.getString("rf.options.everyotherweek.name") + " " +getDayName(reminderDay) + closingParens;
  672.         }
  673.     }
  674.     else {
  675.         val = val + startingParens + reminderFoxBundle.getString("rf.options.everyotherweek.name") + " " +getDayName(reminderDay) + closingParens;
  676.     }
  677.     items[5].label = val;        
  678.     if ( repeatingSelectedIndex == 5) {
  679.         repeatList.selectedItem = items[0];
  680.         repeatList.selectedItem = items[5];
  681.     }
  682.         
  683. }
  684.  
  685.  
  686. function getDayName( dayNum ) {
  687.         return reminderFoxBundle.getString("rf.options.day."+dayNum+".name");
  688. }
  689.  
  690. function getWeekName( weekNum ) {
  691.     if ( weekNum == -1 ) {
  692.         return reminderFoxBundle.getString("rf.options.week.occurrence.5.name");
  693.     }
  694.     else {
  695.         return reminderFoxBundle.getString("rf.options.week.occurrence."+weekNum+".name");
  696.     }
  697. }
  698.  
  699. function loadEventRepeat( calendarEvent, editing ) {
  700.     var repeat = document.getElementById("reminderFox-repeat");    
  701.         var repeatList = document.getElementById("reminderFox-repeatList");    
  702.         if ( !editing ) {
  703.             var defaultRepeat;
  704.             try {
  705.                 defaultRepeat = reminderFox_prefs.getIntPref(REMINDER_FOX_PREF + "." + REMINDER_FOX_DEFAULT_REPEAT);
  706.             } catch(e) {
  707.             }    
  708.             if ( defaultRepeat < 0 ) {
  709.                 repeat.removeAttribute( "checked" );    
  710.             }
  711.             else {
  712.                 repeat.setAttribute("checked", true );
  713.                 repeatList.selectedIndex = defaultRepeat;
  714.             }            
  715.         }
  716.         else {
  717.             if ( calendarEvent.recurrence.type  == REMINDER_RECURRENCE_YEARLY ) {
  718.                 repeatList.selectedIndex = 0;
  719.                 repeat.setAttribute( "checked", true );
  720.             }
  721.             else if ( calendarEvent.recurrence.type  == REMINDER_RECURRENCE_YEARLY_DAY ) {
  722.                 repeatList.selectedIndex = 1;
  723.                 repeat.setAttribute( "checked", true );
  724.             }        
  725.             else     if ( calendarEvent.recurrence.type  == REMINDER_RECURRENCE_MONTHLY_DATE ) {
  726.                 repeatList.selectedIndex = 2;
  727.                 repeat.setAttribute( "checked", true );
  728.             }
  729.             else if ( calendarEvent.recurrence.type  == REMINDER_RECURRENCE_MONTHLY_DAY ) {
  730.                 repeatList.selectedIndex = 3;
  731.                 repeat.setAttribute( "checked", true );
  732.             }
  733.             else    if ( calendarEvent.recurrence.type  == REMINDER_RECURRENCE_WEEKLY ) {        
  734.                 repeatList.selectedIndex = 4;
  735.                 
  736.                 // check for bi-weekly
  737.                 if ( calendarEvent.recurrence.interval == 2 ) {
  738.                     repeatList.selectedIndex = 5;
  739.                 }
  740.                 
  741.                 repeat.setAttribute( "checked", true );        
  742.             }                
  743.             else    if ( calendarEvent.recurrence.type  == REMINDER_RECURRENCE_DAILY ) {        
  744.                 repeatList.selectedIndex = 6;
  745.                 repeat.setAttribute( "checked", true );        
  746.             }                
  747.             else {        
  748.                 repeat.setAttribute( "checked", false );
  749.             }
  750.         }
  751.         reminderFox_repeatChanged();        
  752. }
  753.  
  754. function saveEventRepeat( calendarEvent ) {
  755.     var repeat = document.getElementById("reminderFox-repeat");    
  756.     if ( repeat != null && repeat.getAttribute( "checked" ) == false  ||  repeat.getAttribute( "checked" ) == "false" ) {
  757.          calendarEvent.recurrence.type  =REMINDER_RECURRENCE_ONETIME;
  758.     }
  759.     else {
  760.         var repeatList = document.getElementById("reminderFox-repeatList");    
  761.         var selectedIndex = repeatList.selectedIndex;
  762.         if ( selectedIndex == 0 ) {
  763.             calendarEvent.recurrence.type  = REMINDER_RECURRENCE_YEARLY;
  764.         }
  765.         else     if ( selectedIndex == 1 ) {
  766.             calendarEvent.recurrence.type  = REMINDER_RECURRENCE_YEARLY_DAY;
  767.         }            
  768.         else     if ( selectedIndex == 2 ) {
  769.             calendarEvent.recurrence.type  = REMINDER_RECURRENCE_MONTHLY_DATE;
  770.         }
  771.         else     if ( selectedIndex == 3 ) {
  772.             calendarEvent.recurrence.type  = REMINDER_RECURRENCE_MONTHLY_DAY;
  773.             var reminderDay = calendarEvent.date.getDay();
  774.             var reminderDate = calendarEvent.date.getDate();
  775.             var numberOfDay = reminderDate / 7;
  776.             var intvalue =        parseInt( numberOfDay );
  777.             if ( reminderDate % 7 == 0 ) {
  778.                 intvalue--;
  779.             }
  780.             
  781.             var weekNumber = intvalue + 1;   // 0-based index
  782.             if ( weekNumber == 5 ) {
  783.                 weekNumber = -1;  // set to last week of month
  784.             }
  785.         }
  786.         else     if ( selectedIndex == 4 || selectedIndex == 5 ) {
  787.             calendarEvent.recurrence.type  = REMINDER_RECURRENCE_WEEKLY;
  788.             if ( selectedIndex == 5 ) { 
  789.                 // bi-weekly
  790.                 calendarEvent.recurrence.interval = 2;
  791.             }
  792.         }        
  793.         else     if ( selectedIndex == 6 ) {
  794.             calendarEvent.recurrence.type  = REMINDER_RECURRENCE_DAILY;
  795.         }                            
  796.     }
  797. }
  798.  
  799. function addLeadingZeroTo24HourTime(timeList) {
  800.     var lastChild = timeList.firstChild;
  801.     var items = timeList.firstChild.childNodes;
  802.     for ( var i = 0; i < 24; i++ ) {
  803.         var time = "";
  804.         if ( i < 10 ) {
  805.             time = "0";
  806.         }
  807.         items[i].setAttribute( "label", time + i + ":" + "00" );
  808.     }
  809. }
  810.  
  811. function loadEvent( reminderFoxEvent, editing ) {
  812.     // set the UI elements into the More>> box based on user preference
  813.     loadMoreOptions( reminderFoxEvent );
  814.     
  815.     var use24HourTime;
  816.         try {
  817.             use24HourTime = reminderFox_prefs.getBoolPref(REMINDER_FOX_PREF + "." + REMINDER_FOX_USE_24_HOUR_TIME);
  818.         } catch(e) {
  819.         }                
  820.         if (  use24HourTime ) {
  821.             addLeadingZeroTo24HourTime( document.getElementById("reminderFox-timeList") );
  822.             addLeadingZeroTo24HourTime( document.getElementById("reminderFox-endTimeList") );            
  823.         }
  824.         
  825.         var desc = document.getElementById("newReminderText");
  826.         desc.value = reminderFoxEvent.summary;
  827.         
  828.         var notesToggleButton = document.getElementById("notesToggle");
  829.         var notesText = document.getElementById("notesText");        
  830.         if ( reminderFoxEvent.notes != null ) {
  831.             notesText.setAttribute("hidden", "false");    
  832.             notesToggleButton.setAttribute( "checked", true );
  833.             notesText.value = reminderFoxEvent.notes;
  834.             notesToggleButton.setAttribute("tooltiptext", reminderFoxBundle.getString("rf.options.notes.tooltip.hide"));    
  835.         }
  836.         else {
  837.             notesText.setAttribute("hidden", "true");    
  838.             notesToggleButton.removeAttribute( "checked" );    
  839.             notesToggleButton.setAttribute("tooltiptext", reminderFoxBundle.getString("rf.options.notes.tooltip.show"));    
  840.         }        
  841.             
  842.         
  843.         if (reminderFoxEvent.messageID != null){
  844.             var displayMailButton = document.getElementById("displayMail");
  845.             displayMailButton.setAttribute('style', 'visibility: visible');
  846.             displayMailButton.setAttribute('disabled', 'false');
  847.         }
  848.         
  849.         if (reminderFoxEvent.categories != null && reminderFoxEvent.categories.length > 0 ){
  850.             var catText = document.getElementById("inputRmCategories");            
  851.             catText.setAttribute('value', categoriesClean(reminderFoxEvent.categories));
  852.         }
  853.         else if ( !editing ) {  // if adding a new event, use default category if user has specified it            
  854.             var    defaultCategory = reminderFox_getPreferenceValue( REMINDER_FOX_DEFAULT_CATEGORY );    
  855.             if ( defaultCategory != null && defaultCategory.length > 0 ) {
  856.                 var catText = document.getElementById("inputRmCategories");            
  857.                 catText.setAttribute('value', defaultCategory);
  858.             }                        
  859.         }
  860.         
  861.         var important = document.getElementById("important");    
  862.         if (  reminderFoxEvent.priority == REMINDER_PRIORITY_IMPORTANT) { 
  863.             important.setAttribute( "checked", true );
  864.         }
  865.         else {
  866.             important.setAttribute( "checked", false );
  867.         }
  868.             
  869.         // date...    
  870.         var noCurrentDate = false;
  871.         if ( reminderFoxEvent.date == null ) {
  872.             reminderFoxEvent.date = new Date();
  873.             noCurrentDate = true;
  874.             var todoDateCheckbox = document.getElementById("todoDateCheckbox");
  875.             if ( todoDateCheckbox != null ) {
  876.                 todoDateCheckbox.setAttribute( "checked", false );            
  877.             }
  878.         }
  879.         else {
  880.             var todoDateCheckbox = document.getElementById("todoDateCheckbox");
  881.             if ( todoDateCheckbox != null ) {
  882.                 todoDateCheckbox.setAttribute( "checked", true );
  883.             }
  884.         }
  885.         
  886.         reminderFox_optionsSetNewReminderDate(reminderFoxEvent.date, true);     
  887.         reminderFox_optionsPopulateYearList(reminderFoxEvent.date  );
  888.         
  889.         var allDay = document.getElementById("reminderFox-all-day");    
  890.         var allDayDefault = true;
  891.         if ( !editing ) {
  892.             try {
  893.                 allDayDefault = reminderFox_prefs.getBoolPref(REMINDER_FOX_PREF + "." + REMINDER_FOX_DEFAULT_ALL_DAY);
  894.             } catch(e) {
  895.             }    
  896.         }
  897.         if ( (noCurrentDate ||  reminderFoxEvent.allDayEvent == true) && allDayDefault ) { 
  898.             allDay.setAttribute( "checked", true );
  899.             var use24HourTime;
  900.             try {
  901.                 use24HourTime = reminderFox_prefs.getBoolPref(REMINDER_FOX_PREF + "." + REMINDER_FOX_USE_24_HOUR_TIME);
  902.             } catch(e) {
  903.             }                
  904.             if (  use24HourTime ) {
  905.                 var timeList = document.getElementById("reminderFox-timeList");    
  906.                 timeList.label =  timeList.firstChild.childNodes[0].getAttribute("label");
  907.                 timeList = document.getElementById("reminderFox-endTimeList");    
  908.                 timeList.label =  timeList.firstChild.childNodes[0].getAttribute("label");
  909.             }
  910.             else {
  911.                 var timeList = document.getElementById("reminderFox-timeList");    
  912.                 timeList.label =  timeList.firstChild.childNodes[0].getAttribute("label");
  913.             }        
  914.             
  915.             if ( reminderFoxEvent.endDate == null ) {
  916.                 reminderFoxEvent.endDate = new Date( reminderFoxEvent.date.getFullYear(), reminderFoxEvent.date.getMonth(), reminderFoxEvent.date.getDate() + 1 );            
  917.             }        
  918.         }
  919.         else {
  920.             allDay.setAttribute( "checked", false );
  921.             
  922.             //  set time value
  923.             reminderFox_updateTime( reminderFoxEvent.date, false);
  924.             
  925.             if ( reminderFoxEvent.endDate == null ) {
  926.                 reminderFoxEvent.endDate = new Date( reminderFoxEvent.date.getFullYear(), reminderFoxEvent.date.getMonth(), reminderFoxEvent.date.getDate(), reminderFoxEvent.date.getHours() + 1, reminderFoxEvent.date.getMinutes() );            
  927.             }        
  928.         }    
  929.         
  930.         // update end date  
  931.         //reminderFox_updateTime( reminderFoxEvent.endDate, true);  // done from setNewReminderDate function
  932.         var updatedEndDate = reminderFoxEvent.endDate;
  933.         
  934.         var allDayVal =  allDay.getAttribute("checked" );
  935.         if ( allDayVal == true || allDayVal == "true") {
  936.             updatedEndDate = new Date(reminderFoxEvent.endDate.getFullYear(), reminderFoxEvent.endDate.getMonth(), reminderFoxEvent.endDate.getDate() );
  937.             // if it's all day...  then subtract one day
  938.             updatedEndDate.setDate( updatedEndDate.getDate() - 1 );
  939.         }
  940.         
  941.         reminderFox_optionsSetNewReminderDate(updatedEndDate, true, true);     
  942.         reminderFox_optionsPopulateYearList(updatedEndDate, true  );
  943.         
  944.         if ( noCurrentDate ) { 
  945.             reminderFoxEvent.date = null;
  946.             reminderFoxEvent.endDate = null;
  947.         }
  948.         
  949.         calculateEndTimeOffset();
  950.             
  951.         loadEventRepeat( reminderFoxEvent, editing );
  952.         var showAlert = document.getElementById("reminderFox-alert");    
  953.         
  954.         if ( !editing ) {
  955.             var alarmMinutes;
  956.             try {
  957.                 alarmMinutes = reminderFox_prefs.getIntPref(REMINDER_FOX_PREF + "." + REMINDER_FOX_DEFAULT_ALARM_TIME);
  958.             } catch(e) {
  959.             }    
  960.             if ( alarmMinutes < 0 ) {        
  961.                 showAlert.setAttribute( "checked", false );        
  962.             }
  963.             else {
  964.                 showAlert.setAttribute( "checked", true );    
  965.                 var alertTime = document.getElementById("reminderFox-alertTime");
  966.                 alertTime.label = alarmMinutes;
  967.                 var timeUnitsList = document.getElementById('reminderFox-alertTimeUnits');            
  968.                 var alarmUnitsIndex;
  969.                 try {
  970.                     alarmUnitsIndex = reminderFox_prefs.getIntPref(REMINDER_FOX_PREF + "." + REMINDER_FOX_DEFAULT_ALARM_UNITS);
  971.                 } catch(e) {
  972.                 }                    
  973.                 timeUnitsList.selectedIndex = alarmUnitsIndex;
  974.             }
  975.         }
  976.         else {
  977.             if ( reminderFoxEvent.alarm == null ) {
  978.                 showAlert.setAttribute( "checked", false );    
  979.             }
  980.             else {
  981.                 showAlert.setAttribute( "checked", true );    
  982.                 var alertTime = document.getElementById("reminderFox-alertTime");
  983.                 
  984.                 var alarmTime = reminderFoxEvent.alarm;         
  985.                 var result;
  986.                 var timeUnitsList = document.getElementById('reminderFox-alertTimeUnits');            
  987.                 var timeItems = timeUnitsList.firstChild.childNodes;
  988.                 
  989.                 var alarmIndex1 = alarmTime.indexOf( "-PT" );
  990.                 if ( alarmIndex1 != -1 ) {
  991.                     var alarmIndex2 = alarmTime.indexOf( "M", alarmIndex1 );
  992.                     if ( alarmIndex2 != -1 ) {
  993.                         alarmTime = alarmTime.substring( alarmIndex1 + "-PT".length, alarmIndex2 );        
  994.                         alertTime.label = alarmTime;
  995.                             timeUnitsList.selectedItem = timeItems[0];        
  996.                     }
  997.                     else {
  998.                         alarmIndex2 = alarmTime.indexOf( "H", alarmIndex1 );
  999.                         if ( alarmIndex2 != -1 ) {
  1000.                             alarmTime = alarmTime.substring( alarmIndex1 + "-PT".length, alarmIndex2 );        
  1001.                             alertTime.label =  alarmTime;
  1002.                             timeUnitsList.selectedItem = timeItems[1];        
  1003.                         }    
  1004.                     }    
  1005.                 }
  1006.                 else {
  1007.                     alarmIndex1 = alarmTime.indexOf( "-P" );
  1008.                     if ( alarmIndex1 != -1 ) {
  1009.                         var alarmIndex2 = alarmTime.indexOf( "D", alarmIndex1 );
  1010.                         if ( alarmIndex2 != -1 ) {
  1011.                             alarmTime = alarmTime.substring( alarmIndex1 + "-P".length, alarmIndex2 );        
  1012.                             result = parseInt( alarmTime ) * 24 * 60;    
  1013.                             alertTime.label =  alarmTime;
  1014.                             timeUnitsList.selectedItem = timeItems[2];        
  1015.                         }
  1016.                     }
  1017.                 }        
  1018.             }            
  1019.         }
  1020.  
  1021.         reminderFox_alertChanged();                
  1022.             
  1023.         reminderFox_allDayChanged( editing);
  1024.         reminderFox_handleTodoDate(editing);
  1025.         var monthlist = document.getElementById('monthlist');
  1026.         var month = monthlist.selectedIndex;
  1027.         
  1028.         var daylist = document.getElementById('daylist');
  1029.         var day =daylist.label;
  1030.         // date  check --- if day is less than month; then set it to proper value
  1031.         var yearlist = document.getElementById('yearlist');
  1032.         var year = yearlist.label;
  1033.         day = reminderFox_getValidDateForMonth( year, month, day );
  1034.     
  1035.         var date = new Date( year, month, day );        
  1036.         updateRepeatingList(date, reminderFoxEvent);        
  1037.         
  1038.         if ( reminderFoxEvent.location != null ) {
  1039.             var locationText = document.getElementById("location");
  1040.             locationText.setAttribute('value', reminderFoxEvent.location);            
  1041.         }
  1042.             
  1043.         if ( reminderFoxEvent.url != null ) {
  1044.             var urlText = document.getElementById("url");
  1045.             urlText.setAttribute('value', reminderFoxEvent.url);            
  1046.         }
  1047.         
  1048.         // set focus - have to do in settimeout so onload finishes first
  1049.         setTimeout("document.getElementById('newReminderText').focus();", 0);    
  1050. }
  1051.  
  1052. function calculateEndTimeOffset() {
  1053.     var startDate = getStartDate();
  1054.     var endDate = getEndDate();
  1055.     
  1056.     var endDateTime = endDate.getTime();
  1057.     var startDateTime = startDate.getTime();
  1058.     if ( endDateTime < startDateTime ) {
  1059.         endDateTime = startDateTime;
  1060.     }
  1061.     
  1062.     var endDateTimeOffset = endDateTime - startDateTime;
  1063.     
  1064.     // get minutes from milliseconds:   1000 ms / 60 seconds = mins
  1065.     endDateMinutesOffset= endDateTimeOffset / (1000 *60);  
  1066. }
  1067.  
  1068. function reminderFox_updateTime( date, isEndDate ) {
  1069.     var hours = date.getHours();
  1070.     var AMorPM = REMINDER_FOX_PM;
  1071.             
  1072.     var use24HourTime;
  1073.     try {
  1074.         use24HourTime = reminderFox_prefs.getBoolPref(REMINDER_FOX_PREF + "." + REMINDER_FOX_USE_24_HOUR_TIME);
  1075.     } catch(e) {
  1076.     }                
  1077.     if (  use24HourTime ) {
  1078.         AMorPM = "";
  1079.         if ( hours < 10 ) {
  1080.             hours = "0" + hours;
  1081.         }
  1082.     }                    
  1083.     
  1084.     if ( AMorPM != "" ) {            
  1085.         if ( hours < 12 ) {
  1086.             AMorPM = REMINDER_FOX_AM;
  1087.         }
  1088.         if ( hours == 0 ) {
  1089.             hours = 12;
  1090.         }
  1091.         if ( hours >= 13 ) {
  1092.             hours = hours -12;
  1093.         }
  1094.     }
  1095.  
  1096.     var minutes = date.getMinutes();
  1097.     if ( minutes < 10 ) {
  1098.         minutes = "0" + minutes;
  1099.     }
  1100.     var timeList = null;
  1101.     if ( isEndDate ) {
  1102.         timeList = document.getElementById("reminderFox-endTimeList");    
  1103.     }
  1104.     else {
  1105.         timeList = document.getElementById("reminderFox-timeList");    
  1106.     }
  1107.     
  1108.     var timeString = hours + reminderFoxBundle.getString("rf.add.time.delimiter") + minutes;
  1109.     if ( AMorPM != "" ) {
  1110.         timeString = timeString + " " + AMorPM;        
  1111.     }            
  1112.     timeList.label = timeString;
  1113. }
  1114.  
  1115. function markFieldsReadonly() {            
  1116.     var windowParent = document.getElementById("moreOptionsVbox").parentNode;  
  1117.     recurseDisable( windowParent );
  1118.     
  1119.     document.getElementById("moreReminderItems").removeAttribute ("disabled");   // you can open the More>> items
  1120.     document.getElementById("rf-event-cancel").removeAttribute ("disabled");   // you can cancel
  1121.     document.getElementById("launchUrlButton").removeAttribute ("disabled");  // and launch location button
  1122.     document.getElementById("launchLocationButton").removeAttribute ("disabled");  // and launch url button
  1123.                 
  1124.     // for description, notes, location, and url - remove disabled and set to read-only so you can copy the text
  1125.     document.getElementById("newReminderText").removeAttribute("disabled");
  1126.     document.getElementById("notesText").removeAttribute ("disabled");
  1127.     document.getElementById("url").removeAttribute ("disabled");
  1128.     document.getElementById("location").removeAttribute ("disabled");    
  1129.                 
  1130.     document.getElementById("newReminderText").setAttribute( "readonly", true );
  1131.     document.getElementById("notesText").setAttribute( "readonly", true );
  1132.     document.getElementById("url").setAttribute( "readonly", true );    
  1133.     document.getElementById("location").setAttribute( "readonly", true );    
  1134. }
  1135.  
  1136. function recurseDisable( node) {     
  1137.     for ( var i = 0; i < node.childNodes.length; i++ ) {
  1138.         var child = node.childNodes[i];
  1139.         if ( child != null ) {
  1140.             try {
  1141.                 // ignore labels
  1142.                 if ( child.nodeName != "label") {
  1143.                     child.setAttribute( "disabled", true );
  1144.                     recurseDisable( child );
  1145.                 }
  1146.             }
  1147.             catch ( e ) {                        
  1148.             }
  1149.         }                
  1150.     }        
  1151. }
  1152.  
  1153.  
  1154. function reminderFox_handleTodoDate(editing) {
  1155.     if ( isDateEnabled() ) {
  1156.         var dateItem = document.getElementById("monthlist");
  1157.         dateItem.removeAttribute("disabled");
  1158.         
  1159.         dateItem = document.getElementById("daylist");
  1160.         dateItem.removeAttribute("disabled")
  1161.         
  1162.         dateItem = document.getElementById("yearlist");
  1163.         dateItem.removeAttribute("disabled")
  1164.         
  1165.         dateItem = document.getElementById("reminderFox-timeList");
  1166.         dateItem.removeAttribute("disabled")
  1167.         
  1168.         dateItem = document.getElementById("endmonthlist");
  1169.         dateItem.removeAttribute("disabled");
  1170.         
  1171.         dateItem = document.getElementById("enddaylist");
  1172.         dateItem.removeAttribute("disabled")
  1173.         
  1174.         dateItem = document.getElementById("endyearlist");
  1175.         dateItem.removeAttribute("disabled")
  1176.         
  1177.         dateItem = document.getElementById("reminderFox-endTimeList");
  1178.         dateItem.removeAttribute("disabled")
  1179.         
  1180.         dateItem = document.getElementById("reminderFox-all-day");
  1181.         dateItem.removeAttribute("disabled")    
  1182.         
  1183.         dateItem = document.getElementById("reminderFox-alert");        
  1184.         dateItem.removeAttribute("disabled")    
  1185.         
  1186.         dateItem = document.getElementById("reminderFox-alertTime");
  1187.         dateItem.removeAttribute("disabled")    
  1188.         
  1189.         dateItem = document.getElementById('reminderFox-alertTimeUnits');                        
  1190.         dateItem.removeAttribute("disabled")                
  1191.         
  1192.         dateItem = document.getElementById('reminderFox-alertInfo');                
  1193.         dateItem.removeAttribute("disabled")                
  1194.         
  1195.         dateItem = document.getElementById('datepickerToggle');                
  1196.         dateItem.removeAttribute("disabled");
  1197.         
  1198.         dateItem = document.getElementById('datepickerEndToggle');                
  1199.         dateItem.removeAttribute("disabled");
  1200.         
  1201.         dateItem = document.getElementById('reminderFox-repeatList');                
  1202.         dateItem.removeAttribute("disabled");
  1203.         
  1204.         dateItem = document.getElementById('reminderFox-repeat');        
  1205.         dateItem.removeAttribute("disabled");
  1206.         
  1207.         reminderFox_allDayChanged(editing);
  1208.         reminderFox_alertChanged();
  1209.         reminderFox_repeatChanged();
  1210.     }
  1211.     else {
  1212.         var dateItem = document.getElementById("monthlist");
  1213.         dateItem.setAttribute("disabled", "true");    
  1214.         
  1215.         dateItem = document.getElementById("daylist");
  1216.         dateItem.setAttribute("disabled", "true");    
  1217.         
  1218.         dateItem = document.getElementById("yearlist");
  1219.         dateItem.setAttribute("disabled", "true");                    
  1220.         
  1221.         dateItem = document.getElementById("reminderFox-timeList");
  1222.         dateItem.setAttribute("disabled", "true");        
  1223.         
  1224.         dateItem = document.getElementById("endmonthlist");
  1225.         dateItem.setAttribute("disabled", "true");    
  1226.         
  1227.         dateItem = document.getElementById("enddaylist");
  1228.         dateItem.setAttribute("disabled", "true");    
  1229.         
  1230.         dateItem = document.getElementById("endyearlist");
  1231.         dateItem.setAttribute("disabled", "true");                    
  1232.         
  1233.         dateItem = document.getElementById("reminderFox-endTimeList");
  1234.         dateItem.setAttribute("disabled", "true");        
  1235.         
  1236.         dateItem = document.getElementById("reminderFox-all-day");
  1237.         dateItem.setAttribute("disabled", "true");                        
  1238.         
  1239.         dateItem = document.getElementById("reminderFox-alert");        
  1240.         dateItem.setAttribute("disabled", "true");        
  1241.         
  1242.         dateItem = document.getElementById("reminderFox-alertTime");
  1243.         dateItem.setAttribute("disabled", "true");    
  1244.         
  1245.         dateItem = document.getElementById('reminderFox-alertTimeUnits');                        
  1246.         dateItem.setAttribute("disabled", "true");        
  1247.         
  1248.         dateItem = document.getElementById('reminderFox-alertInfo');            
  1249.         dateItem.setAttribute("disabled", "true");            
  1250.         
  1251.         dateItem = document.getElementById('datepickerToggle');                
  1252.         dateItem.setAttribute("disabled", "true");    
  1253.         
  1254.         dateItem = document.getElementById('datepickerEndToggle');                
  1255.         dateItem.setAttribute("disabled", "true");    
  1256.         
  1257.         dateItem = document.getElementById('reminderFox-repeatList');                
  1258.         dateItem.setAttribute("disabled", "true");    
  1259.         
  1260.         dateItem = document.getElementById('reminderFox-repeat');                
  1261.         dateItem.setAttribute("disabled", "true");    
  1262.     }
  1263.     
  1264.     updateDateDescriptionLabel();
  1265. }
  1266.  
  1267.  
  1268. function saveEvent( reminderfoxEvent ) {
  1269.     if ( isDateEnabled() ) {
  1270.         var success = reminderFox_saveDates(reminderfoxEvent);
  1271.         if ( !success ) {
  1272.             return false;
  1273.         }
  1274.     }
  1275.     
  1276.     var desc = document.getElementById("newReminderText");
  1277.     reminderfoxEvent.summary = desc.value;
  1278.  
  1279.     var important = document.getElementById("important");    
  1280.     var importantVal =  important.getAttribute("checked" );
  1281.     if ( importantVal == true || importantVal == "true" ) { 
  1282.         reminderfoxEvent.priority = REMINDER_PRIORITY_IMPORTANT;
  1283.     }
  1284.     else {
  1285.         reminderfoxEvent.priority = REMINDER_PRIORITY_NORMAL;
  1286.     }
  1287.     
  1288.     var notesText = document.getElementById("notesText");
  1289.     var notes =notesText.value;
  1290.     if ( notes != null ) {
  1291.         notes = reminderFox_trim( notes );
  1292.         if ( notes != "" ) {
  1293.             reminderfoxEvent.notes = notes;
  1294.         }
  1295.         else { 
  1296.             reminderfoxEvent.notes = null;
  1297.         }            
  1298.     }         
  1299.        
  1300.     var cats = document.getElementById("inputRmCategories");        
  1301.     if (desc.value != "") {            
  1302.         reminderfoxEvent.categories = categoriesClean(cats.value);
  1303.         }
  1304.     else {
  1305.            reminderfoxEvent.categories =null;
  1306.     }
  1307.  
  1308.     saveMoreOptions( reminderfoxEvent );
  1309.  
  1310.     if ( isDateEnabled() ) {
  1311. //        var success = reminderFox_saveDates(reminderfoxEvent);
  1312. //        if ( !success ) {
  1313. //            return false;
  1314. //        }
  1315.         
  1316.         saveEventRepeat(reminderfoxEvent);
  1317.         
  1318.         var showAlert = document.getElementById("reminderFox-alert");    
  1319.         var alertVal =  showAlert.getAttribute("checked" );
  1320.         if ( alertVal == true || alertVal == "true") {
  1321.             var alertTime = document.getElementById("reminderFox-alertTime");
  1322.             var alertTimeVal = alertTime.label;        
  1323.             
  1324.             if ( reminderFox_isInteger( alertTimeVal ) ) {                
  1325.                 var timeUnitsList = document.getElementById('reminderFox-alertTimeUnits');            
  1326.                 var timeSelected = timeUnitsList.selectedIndex;
  1327.                 if ( timeSelected == 0 ) {
  1328.                     reminderfoxEvent.alarm =  "-PT" + alertTimeVal + "M";                
  1329.                 }
  1330.                 else if ( timeSelected == 1 ) {
  1331.                     reminderfoxEvent.alarm =  "-PT" + alertTimeVal + "H";                
  1332.                 }
  1333.                 else if ( timeSelected == 2 ) {
  1334.                     reminderfoxEvent.alarm =  "-P" + alertTimeVal + "D";                
  1335.                 }        
  1336.             }        
  1337.         }        
  1338.         else {
  1339.             reminderfoxEvent.alarm = null;
  1340.         }            
  1341.     }    
  1342.     else {
  1343.         reminderfoxEvent.date = null;
  1344.         reminderfoxEvent.endDate = null;
  1345.         reminderfoxEvent.alarm = null;
  1346.     }
  1347.     
  1348.     return true;
  1349. }
  1350.  
  1351.  
  1352. function getDateFromUI( date ) {
  1353.     var monthlist = document.getElementById('monthlist');
  1354.     var currentMonth = monthlist.selectedIndex;
  1355.     var daylist = document.getElementById('daylist');
  1356.     var currentDay =  daylist.label;
  1357.     var yearlist = document.getElementById('yearlist');
  1358.     var currentYear =  yearlist.label;
  1359.     
  1360.     if ( date == null ) { 
  1361.         date = new Date( currentYear, currentMonth, currentDay );
  1362.     }
  1363.     else { 
  1364.         if ( date.getFullYear() !=currentYear ||
  1365.             date.getMonth() != currentMonth ||
  1366.             date.getDate() != currentDay ) {
  1367.             
  1368.             if (!reminderFox_isInteger( currentDay ) ) {
  1369.                 currentDay =     date.getDate();
  1370.             }
  1371.             if (!reminderFox_isInteger( currentYear ) ) {
  1372.                 currentYear = date.getFullYear();
  1373.             }                
  1374.             date = new Date( currentYear, currentMonth, currentDay );
  1375.         }        
  1376.     }
  1377.     return date;
  1378. }
  1379.  
  1380. function rmFx_notesAddDT(op) {
  1381.     var notesText = document.getElementById("notesText");
  1382.     if (notesText.getAttribute ("focused") != "true") {return;}
  1383.  
  1384.     // OK the 'Notes' has focus ... go to add d/t
  1385.     var start = notesText.selectionStart; 
  1386.     var end = notesText.textLength;
  1387.     var thisDT = rmFx_getDatum();
  1388.     
  1389.     notesText.value = notesText.value.substring(0,start) + 
  1390.         "[" + thisDT + "] " + notesText.value.substring(start,end);
  1391.     
  1392.     notesText.setSelectionRange(start,start+ thisDT.length+3);
  1393. }
  1394.  
  1395.  
  1396.  
  1397. function innerClicked(timeEntry) {
  1398.     reminderFox_innerTimeClicked = true;
  1399.     var timeLabel  = timeEntry.getAttribute("label");
  1400.     
  1401.     var timeList = timeEntry.parentNode.parentNode.parentNode.parentNode;
  1402.     //var timeList = document.getElementById("reminderFox-timeList");    
  1403.     timeList.label =  timeLabel;
  1404.     
  1405.     if ( timeList.getAttribute("id") == "reminderFox-endTimeList" ) {
  1406.         reminderFox_timeChanged( true );
  1407.     }
  1408.     else {
  1409.         reminderFox_timeChanged( false );
  1410.      }
  1411.      
  1412.      reminderFox_updateDateFromTimeClick();
  1413.      
  1414. }
  1415.  
  1416. function reminderFox_updateDateFromTimeClick() {
  1417.      if ( oeDatePicker.gSelectedDate != null ) {
  1418.             var timeList = document.getElementById("reminderFox-timeList");    
  1419.             var time = timeList.label;
  1420.             var startindex = time.indexOf(reminderFoxBundle.getString("rf.add.time.delimiter") ); 
  1421.             // look for some other common delimiters...
  1422.             if ( startindex == -1 ) {
  1423.                 startindex = time.indexOf(":" ); 
  1424.                 if ( startindex == -1 ) {
  1425.                     startindex = time.indexOf("." ); 
  1426.                     if ( startindex == -1 ) {
  1427.                         startindex = time.indexOf("h" ); 
  1428.                     }
  1429.                 }
  1430.             }
  1431.             if ( startindex != -1 ) {
  1432.                 try {
  1433.                     var hoursString = time.substring(0, startindex );
  1434.                     if ( hoursString.length == 2 && hoursString.indexOf( "0" ) == 0 ) {
  1435.                         hoursString = hoursString.substring(1);
  1436.                     }
  1437.                     var hours = parseInt(hoursString);
  1438.                     var minutes =  time.substring(startindex+1, startindex + 3);
  1439.                     // now trim remainder
  1440.                     var remainder = time.substring( startindex + 3, time.length );
  1441.                     if ( remainder != "" ) {
  1442.                         remainder = reminderFox_trim( remainder );
  1443.                         var AMorPM = remainder;
  1444.                         if ( AMorPM.toUpperCase() == REMINDER_FOX_PM.toUpperCase() ) {
  1445.                             if ( hours != 12 ) {
  1446.                                 hours = hours+12;
  1447.                             }
  1448.                         }
  1449.                         else { 
  1450.                             if ( hours == 12 ) {
  1451.                                 hours = 0;
  1452.                             }
  1453.                         }
  1454.                     }
  1455.                     if ( reminderFox_isInteger( hours +"" ) && reminderFox_isInteger( minutes ) ) {
  1456.                         oeDatePicker.gSelectedDate.setHours( hours, minutes );
  1457.                         reminderFox_updateSnoozeTimeDate();
  1458.                     }
  1459.                 }
  1460.                 catch( e ) {
  1461.                 }
  1462.             }
  1463.     }
  1464. }
  1465.  
  1466. function reminderFox_timeChanged( isEndDate ) {
  1467.     if (isEndDate) {
  1468.         // set new end date offset
  1469.         calculateEndTimeOffset();
  1470.     }
  1471.     else {
  1472.         // start date has changed; set new end date based on offset
  1473.         updateEndDateWithOffset();
  1474.      }
  1475. }
  1476.  
  1477.  
  1478. function reminderFox_timeClicked( timeEntry) {
  1479.     if ( !reminderFox_innerTimeClicked ) { 
  1480.         var id  = timeEntry.getAttribute("id");
  1481.         var timeLabel  = timeEntry.getAttribute("label");
  1482.         
  1483.          var timeList = timeEntry.parentNode.parentNode;
  1484.     
  1485.         //var timeList = document.getElementById("reminderFox-timeList");    
  1486.         
  1487.         timeList.label =  timeLabel;
  1488.         
  1489.         //var popup = document.getElementById( "timepopup"  );
  1490.         var popup = timeEntry.parentNode;
  1491.         
  1492.         popup.hidePopup();
  1493.         
  1494.         if ( timeList.getAttribute("id") == "reminderFox-endTimeList" ) {
  1495.             // set new end date offset
  1496.             calculateEndTimeOffset();
  1497.         }
  1498.         else {
  1499.             // start date has changed; set new end date based on offset
  1500.             updateEndDateWithOffset();
  1501.          }
  1502.          
  1503.          reminderFox_updateDateFromTimeClick();
  1504.     }
  1505.     else {
  1506.         reminderFox_innerTimeClicked = false;
  1507.     }
  1508. }
  1509.  
  1510.  
  1511. function onTimePopupOpen(menupopup) {
  1512.     var timeParentMenu = menupopup.parentNode;
  1513.     var originalTime = timeParentMenu.getAttribute("label" );
  1514.     
  1515.     if ( menupopup.hasChildNodes()) {
  1516.         // nodes have already been populated
  1517.         return;
  1518.     }    
  1519.     
  1520.     // add sub context menu times 
  1521.     // the first is the current default
  1522.     var menuItem = document.createElement("menuitem");
  1523.     menuItem.setAttribute( "label", originalTime );
  1524.     menuItem.setAttribute( "onclick", "innerClicked(this);");
  1525.     menupopup.appendChild(menuItem);
  1526.         
  1527.     // now look for last "00" and replace with 15, 30, 45 increments    
  1528.     var zeroIndex = originalTime.lastIndexOf( "00");
  1529.     var timeIncrement = originalTime.substring(0,zeroIndex) + "15" + 
  1530.         originalTime.substring(zeroIndex + "00".length, originalTime.length);    
  1531.     menuItem = document.createElement("menuitem");
  1532.     menuItem.setAttribute( "label", timeIncrement );
  1533.     menuItem.setAttribute( "onclick", "innerClicked(this);");
  1534.     menupopup.appendChild(menuItem);
  1535.     
  1536.     timeIncrement = originalTime.substring(0,zeroIndex) + "30" + 
  1537.         originalTime.substring(zeroIndex + "00".length, originalTime.length);
  1538.     menuItem = document.createElement("menuitem");
  1539.     menuItem.setAttribute( "label", timeIncrement );
  1540.     menuItem.setAttribute( "onclick", "innerClicked(this);");
  1541.     menupopup.appendChild(menuItem);
  1542.     
  1543.     timeIncrement = originalTime.substring(0,zeroIndex) + "45" + 
  1544.         originalTime.substring(zeroIndex + "00".length, originalTime.length);
  1545.     menuItem = document.createElement("menuitem");
  1546.     menuItem.setAttribute( "label", timeIncrement );
  1547.     menuItem.setAttribute( "onclick", "innerClicked(this);");
  1548.     menupopup.appendChild(menuItem);
  1549. }    
  1550.  
  1551.  
  1552. function reminderFox_saveDates(reminderfoxEvent) {
  1553.     var ret_Success = true;
  1554.     // start date
  1555.     var monthlist = document.getElementById('monthlist');
  1556.     var currentMonth = monthlist.selectedIndex;
  1557.     var daylist = document.getElementById('daylist');
  1558.     var currentDay =  daylist.label;
  1559.     var yearlist = document.getElementById('yearlist');
  1560.     var currentYear =  yearlist.label;
  1561.     if ( reminderfoxEvent.date == null ) { 
  1562.         reminderfoxEvent.date = new Date( currentYear, currentMonth, currentDay );
  1563.     }
  1564.     else { 
  1565.         if ( reminderfoxEvent.date.getFullYear() !=currentYear ||
  1566.             reminderfoxEvent.date.getMonth() != currentMonth ||
  1567.             reminderfoxEvent.date.getDate() != currentDay ) {
  1568.             
  1569.             if (!reminderFox_isInteger( currentDay ) ) {
  1570.                 currentDay =     reminderfoxEvent.date.getDate();
  1571.             }
  1572.             if (!reminderFox_isInteger( currentYear ) ) {
  1573.                 currentYear = reminderfoxEvent.date.getFullYear();
  1574.             }                
  1575.             reminderfoxEvent.date = new Date( currentYear, currentMonth, currentDay );
  1576.         }        
  1577.     }
  1578.     
  1579.     // end date
  1580.     monthlist = document.getElementById('endmonthlist');
  1581.     currentMonth =monthlist.selectedIndex;
  1582.     
  1583.     daylist = document.getElementById('enddaylist');
  1584.     currentDay =  daylist.label;
  1585.     yearlist = document.getElementById('endyearlist');
  1586.     currentYear =  yearlist.label;
  1587.     
  1588.     if ( reminderfoxEvent.endDate == null ) { 
  1589.         reminderfoxEvent.endDate = new Date( currentYear, currentMonth, currentDay );
  1590.     }
  1591.     else { 
  1592.         if ( reminderfoxEvent.endDate.getFullYear() !=currentYear ||
  1593.             reminderfoxEvent.endDate.getMonth() != currentMonth ||
  1594.             reminderfoxEvent.endDate.getDate() != currentDay ) {
  1595.             
  1596.             if (!reminderFox_isInteger( currentDay ) ) {
  1597.                 currentDay =     reminderfoxEvent.endDate.getDate();
  1598.             }
  1599.             if (!reminderFox_isInteger( currentYear ) ) {
  1600.                 currentYear = reminderfoxEvent.endDate.getFullYear();
  1601.             }                
  1602.             reminderfoxEvent.endDate = new Date( currentYear, currentMonth, currentDay );
  1603.         }        
  1604.     }
  1605.         
  1606.         
  1607.     var allDay = document.getElementById("reminderFox-all-day");    
  1608.     if ( allDay.getAttribute( "checked" ) == false ||  allDay.getAttribute( "checked" ) =="false" ) { 
  1609.         try {
  1610.             var timeList = document.getElementById("reminderFox-timeList");    
  1611.             var time = timeList.label;
  1612.             var startindex = time.indexOf(reminderFoxBundle.getString("rf.add.time.delimiter") ); 
  1613.             // look for some other common delimiters...
  1614.             if ( startindex == -1 ) {
  1615.                 startindex = time.indexOf(":" ); 
  1616.                 if ( startindex == -1 ) {
  1617.                     startindex = time.indexOf("." ); 
  1618.                     if ( startindex == -1 ) {
  1619.                         startindex = time.indexOf("h" ); 
  1620.                     }
  1621.                 }
  1622.             }
  1623.             if ( startindex != -1 ) {
  1624.                 try {
  1625.                     var hoursString = time.substring(0, startindex );
  1626.                     if ( hoursString.length == 2 && hoursString.indexOf( "0" ) == 0 ) {
  1627.                         hoursString = hoursString.substring(1);
  1628.                     }
  1629.                     var hours = parseInt(hoursString);
  1630.                     var minutes =  time.substring(startindex+1, startindex + 3);
  1631.                     // now trim remainder
  1632.                     var remainder = time.substring( startindex + 3, time.length );
  1633.                     if ( remainder != "" ) {
  1634.                         remainder = reminderFox_trim( remainder );
  1635.                         var AMorPM = remainder;
  1636.                         if ( AMorPM.toUpperCase() == REMINDER_FOX_PM.toUpperCase() ) {
  1637.                             if ( hours != 12 ) {
  1638.                                 hours = hours+12;
  1639.                             }
  1640.                         }
  1641.                         else { 
  1642.                             if ( hours == 12 ) {
  1643.                                 hours = 0;
  1644.                             }
  1645.                         }
  1646.                     }
  1647.                     if ( reminderFox_isInteger( hours +"" ) && reminderFox_isInteger( minutes ) ) {
  1648.                         reminderfoxEvent.date.setHours( hours, minutes );
  1649.                     }
  1650.                 }
  1651.                 catch ( e ) {
  1652.                 }
  1653.             }
  1654.             
  1655.             // end date
  1656.             timeList = document.getElementById("reminderFox-endTimeList");    
  1657.             time = timeList.label;
  1658.             startindex = time.indexOf(reminderFoxBundle.getString("rf.add.time.delimiter") ); 
  1659.             // look for some other common delimiters...
  1660.             if ( startindex == -1 ) {
  1661.                 startindex = time.indexOf(":" ); 
  1662.                 if ( startindex == -1 ) {
  1663.                     startindex = time.indexOf("." ); 
  1664.                     if ( startindex == -1 ) {
  1665.                         startindex = time.indexOf("h" ); 
  1666.                     }
  1667.                 }
  1668.             }
  1669.             if ( startindex != -1 ) {
  1670.                 try {
  1671.                     var hoursString = time.substring(0, startindex );
  1672.                     if ( hoursString.length == 2 && hoursString.indexOf( "0" ) == 0 ) {
  1673.                         hoursString = hoursString.substring(1);
  1674.                     }
  1675.                     var hours = parseInt(hoursString);
  1676.                     var minutes =  time.substring(startindex+1, startindex + 3);
  1677.                     // now trim remainder
  1678.                     var remainder = time.substring( startindex + 3, time.length );
  1679.                     if ( remainder != "" ) {
  1680.                         remainder = reminderFox_trim( remainder );
  1681.                         var AMorPM = remainder;
  1682.                         if ( AMorPM.toUpperCase() == REMINDER_FOX_PM.toUpperCase() ) {
  1683.                             if ( hours != 12 ) {
  1684.                                 hours = hours+12;
  1685.                             }
  1686.                         }
  1687.                         else { 
  1688.                             if ( hours == 12 ) {
  1689.                                 hours = 0;
  1690.                             }
  1691.                         }
  1692.                     }
  1693.                     if ( reminderFox_isInteger( hours +"" ) && reminderFox_isInteger( minutes ) ) {
  1694.                         reminderfoxEvent.endDate.setHours( hours, minutes );
  1695.                     }
  1696.                 }
  1697.                 catch ( e ) {
  1698.                 }
  1699.             }
  1700.             // end enddate
  1701.             
  1702.             reminderfoxEvent.allDayEvent = false;
  1703.         }
  1704.         catch( e ) {
  1705.         }
  1706.         
  1707.         // clear seconds to calculate duration
  1708.         reminderfoxEvent.date.setSeconds( 0 );
  1709.         reminderfoxEvent.endDate.setSeconds( 0 );
  1710.         reminderfoxEvent.date.setMilliseconds( 0 );
  1711.         reminderfoxEvent.endDate.setMilliseconds( 0 );
  1712.     }
  1713.     else {
  1714.         reminderfoxEvent.allDayEvent = true;
  1715.         
  1716.         // clear hours for all day events to calculate duration
  1717.         reminderfoxEvent.date.setHours( 0 );
  1718.         reminderfoxEvent.date.setMinutes( 0 );
  1719.         reminderfoxEvent.date.setSeconds( 0 );
  1720.         reminderfoxEvent.date.setMilliseconds( 0 );
  1721.         reminderfoxEvent.endDate.setHours( 0 );
  1722.         reminderfoxEvent.endDate.setMinutes( 0 );
  1723.         reminderfoxEvent.endDate.setSeconds( 0 );
  1724.         reminderfoxEvent.endDate.setMilliseconds( 0 );
  1725.         
  1726.         //  all day...  then add one day
  1727.         reminderfoxEvent.endDate.setDate( reminderfoxEvent.endDate.getDate() + 1 );
  1728.     }
  1729.         
  1730.     reminderfoxEvent.durationTime = reminderfoxEvent.endDate.getTime() - reminderfoxEvent.date.getTime();
  1731.  
  1732.     // if end date is greater than start date, clear it
  1733.     if ( (reminderfoxEvent.endDate.getTime() + 1000) <  reminderfoxEvent.date.getTime() ) {
  1734.         alert( reminderFoxBundle.getString("rf.options.validation.endDate") );
  1735.         ret_Success = false;
  1736.         reminderfoxEvent.endDate = null;
  1737.         reminderfoxEvent.durationTime = null;
  1738.     }
  1739.  
  1740.     return ret_Success;
  1741.     
  1742. }
  1743.  
  1744. function updateEndDateWithOffset() {
  1745.     if ( endDateMinutesOffset != null && endDateMinutesOffset >= 0 ) {
  1746.         var newEndDate = getStartDate();
  1747.         newEndDate.setMinutes(newEndDate.getMinutes() + endDateMinutesOffset);
  1748.         var allDay = document.getElementById("reminderFox-all-day");    
  1749.         var allDayVal =  allDay.getAttribute("checked" );    
  1750.         if ( allDayVal == true || allDayVal == "true") {
  1751.             // if it's all day...  then subtract one day
  1752.             newEndDate.setDate( newEndDate.getDate() - 1 );
  1753.         }
  1754.         
  1755.         reminderFox_optionsSetNewReminderDate(newEndDate, true, true);    
  1756.     }
  1757. }
  1758.  
  1759.  
  1760. function getStartDate() {
  1761.     // start date
  1762.     var monthlist = document.getElementById('monthlist');
  1763.     var currentMonth = monthlist.selectedIndex;
  1764.     var daylist = document.getElementById('daylist');
  1765.     var currentDay =  daylist.label;
  1766.     var yearlist = document.getElementById('yearlist');
  1767.     var currentYear =  yearlist.label;
  1768.     var startDate = new Date( currentYear, currentMonth, currentDay );
  1769.     
  1770.     var allDay = document.getElementById("reminderFox-all-day");    
  1771.     if ( allDay.getAttribute( "checked" ) == false ||  allDay.getAttribute( "checked" ) =="false" ) { 
  1772.         try {
  1773.             var timeList = document.getElementById("reminderFox-timeList");    
  1774.             var time = timeList.label;
  1775.             var startindex = time.indexOf(reminderFoxBundle.getString("rf.add.time.delimiter") ); 
  1776.             // look for some other common delimiters...
  1777.             if ( startindex == -1 ) {
  1778.                 startindex = time.indexOf(":" ); 
  1779.                 if ( startindex == -1 ) {
  1780.                     startindex = time.indexOf("." ); 
  1781.                     if ( startindex == -1 ) {
  1782.                         startindex = time.indexOf("h" ); 
  1783.                     }
  1784.                 }
  1785.             }
  1786.             if ( startindex != -1 ) {
  1787.                 try {
  1788.                     var hoursString = time.substring(0, startindex );
  1789.                     if ( hoursString.length == 2 && hoursString.indexOf( "0" ) == 0 ) {
  1790.                         hoursString = hoursString.substring(1);
  1791.                     }
  1792.                     var hours = parseInt(hoursString);
  1793.                     var minutes =  time.substring(startindex+1, startindex + 3);
  1794.                     // now trim remainder
  1795.                     var remainder = time.substring( startindex + 3, time.length );
  1796.                     if ( remainder != "" ) {
  1797.                         remainder = reminderFox_trim( remainder );
  1798.                         var AMorPM = remainder;
  1799.                         if ( AMorPM.toUpperCase() == REMINDER_FOX_PM.toUpperCase() ) {
  1800.                             if ( hours != 12 ) {
  1801.                                 hours = hours+12;
  1802.                             }
  1803.                         }
  1804.                         else { 
  1805.                             if ( hours == 12 ) {
  1806.                                 hours = 0;
  1807.                             }
  1808.                         }
  1809.                     }
  1810.                     if ( reminderFox_isInteger( hours +"" ) && reminderFox_isInteger( minutes ) ) {
  1811.                         startDate.setHours( hours, minutes );
  1812.                     }
  1813.                 }
  1814.                 catch ( e ) {
  1815.                 }
  1816.             }
  1817.         }
  1818.         catch( e ) {
  1819.         }
  1820.     }
  1821.     return startDate;
  1822. }
  1823.  
  1824.  
  1825. function getEndDate() {
  1826.     // end date
  1827.     var monthlist = document.getElementById('endmonthlist');
  1828.     var currentMonth = monthlist.selectedIndex;
  1829.     var daylist = document.getElementById('enddaylist');
  1830.     var currentDay =  daylist.label;
  1831.     var yearlist = document.getElementById('endyearlist');
  1832.     var currentYear =  yearlist.label;
  1833.     var endDate = new Date( currentYear, currentMonth, currentDay );
  1834.     
  1835.     var allDay = document.getElementById("reminderFox-all-day");    
  1836.     if ( allDay.getAttribute( "checked" ) == false ||  allDay.getAttribute( "checked" ) =="false" ) { 
  1837.         try {
  1838.             var timeList = document.getElementById("reminderFox-timeList");    
  1839.             var time = timeList.label;
  1840.             var startindex = time.indexOf(reminderFoxBundle.getString("rf.add.time.delimiter") ); 
  1841.             
  1842.             // end date
  1843.             var timeList = document.getElementById("reminderFox-endTimeList");    
  1844.             var time = timeList.label;
  1845.             var startindex = time.indexOf(reminderFoxBundle.getString("rf.add.time.delimiter") ); 
  1846.             // look for some other common delimiters...
  1847.             if ( startindex == -1 ) {
  1848.                 startindex = time.indexOf(":" ); 
  1849.                 if ( startindex == -1 ) {
  1850.                     startindex = time.indexOf("." ); 
  1851.                     if ( startindex == -1 ) {
  1852.                         startindex = time.indexOf("h" ); 
  1853.                     }
  1854.                 }
  1855.             }
  1856.             if ( startindex != -1 ) {
  1857.                 try {
  1858.                     var hoursString = time.substring(0, startindex );
  1859.                     if ( hoursString.length == 2 && hoursString.indexOf( "0" ) == 0 ) {
  1860.                         hoursString = hoursString.substring(1);
  1861.                     }
  1862.                     var hours = parseInt(hoursString);
  1863.                     var minutes =  time.substring(startindex+1, startindex + 3);
  1864.                     // now trim remainder
  1865.                     var remainder = time.substring( startindex + 3, time.length );
  1866.                     if ( remainder != "" ) {
  1867.                         remainder = reminderFox_trim( remainder );
  1868.                         var AMorPM = remainder;
  1869.                         if ( AMorPM.toUpperCase() == REMINDER_FOX_PM.toUpperCase() ) {
  1870.                             if ( hours != 12 ) {
  1871.                                 hours = hours+12;
  1872.                             }
  1873.                         }
  1874.                         else { 
  1875.                             if ( hours == 12 ) {
  1876.                                 hours = 0;
  1877.                             }
  1878.                         }
  1879.                     }
  1880.                     if ( reminderFox_isInteger( hours +"" ) && reminderFox_isInteger( minutes ) ) {
  1881.                         endDate.setHours( hours, minutes );
  1882.                     }
  1883.                 }
  1884.                 catch ( e ) {
  1885.                 }
  1886.             }
  1887.             // end enddate
  1888.         }
  1889.         catch( e ) {
  1890.         }
  1891.     }
  1892.     else {
  1893.         //  all day...  then add one day
  1894.         endDate.setDate( endDate.getDate() + 1 );
  1895.     }
  1896.     return endDate;
  1897. }
  1898.  
  1899. function dateToolTip(tooltipItem, isEnd) {
  1900.      while (tooltipItem.hasChildNodes()) {
  1901.          tooltipItem.removeChild(tooltipItem.firstChild);
  1902.        }     
  1903.  
  1904.      var dateVariableString;
  1905.     try {
  1906.         dateVariableString = reminderFox_getUnicodePref(REMINDER_FOX_PREF + "." + REMINDER_FOX_LIST_DATE_LABEL);
  1907.     } catch(e) {
  1908.     }            
  1909.     if ( dateVariableString.indexOf( "longDay" == -1 && dateVariableString.indexOf( "shortDay" ) == -1 ) ) {
  1910.         dateVariableString = "[longDay], " + dateVariableString;
  1911.     }
  1912.     var date = null;
  1913.     if ( isEnd ) {
  1914.         date = getEndDate();
  1915.         
  1916.         var allDay = document.getElementById("reminderFox-all-day");    
  1917.         var allDayVal =  allDay.getAttribute("checked" );    
  1918.         if ( allDayVal == true || allDayVal == "true") {
  1919.             // if it's all day...  then subtract one day for end date
  1920.             date.setDate( date.getDate() - 1 );
  1921.         }
  1922.     }
  1923.     else {
  1924.         date = getStartDate();
  1925.     }
  1926.     var dateString =reminderFox_getDateVariable( null, date, dateVariableString );        
  1927.     var title = document.createElement("description");
  1928.     title.setAttribute("value", dateString);
  1929.     tooltipItem.appendChild(title);        
  1930.     
  1931.    return true;
  1932. }
  1933.  
  1934. function updateDateDescriptionLabel() {
  1935.     var reminderDateDesc = document.getElementById("reminderDateDesc");  
  1936.     if ( reminderDateDesc != null ) { 
  1937.         // if a ToDo with date disabled... then show an empty string
  1938.         var todoDateCheckbox = document.getElementById("todoDateCheckbox");
  1939.         if ( todoDateCheckbox != null ) {
  1940.             var dateEnabled =  todoDateCheckbox.getAttribute("checked" );
  1941.             if ( dateEnabled != true && dateEnabled != "true" ) {     
  1942.                 reminderDateDesc.setAttribute( "value", "");
  1943.                 return;
  1944.             }
  1945.         }
  1946.         
  1947.          var dateVariableString;
  1948.         try {
  1949.             dateVariableString = reminderFox_getUnicodePref(REMINDER_FOX_PREF + "." + REMINDER_FOX_LIST_DATE_LABEL);
  1950.         } catch(e) {
  1951.         }            
  1952.         if ( dateVariableString.indexOf( "longDay" ) == -1 && dateVariableString.indexOf( "shortDay" ) == -1 )  {
  1953.             dateVariableString = "[longDay], " + dateVariableString;
  1954.         }
  1955.         var date = getStartDate();
  1956.         var dateString =reminderFox_getDateVariable( null, date, dateVariableString );        
  1957.         reminderDateDesc.setAttribute( "value", dateString);
  1958.     }
  1959. }
  1960.